// 文件上传工具
const baseURL = 'http://localhost:8080/';

/**
 * 上传文件
 * @param {string} filePath - 文件路径
 * @param {string} fieldName - 表单字段名
 * @returns {Promise} 返回上传结果
 */
const uploadFile = (filePath, fieldName = 'file') => {
  return new Promise((resolve, reject) => {
    // 检查网络状态
    wx.getNetworkType({
      success: function(res) {
        if (res.networkType === 'none') {
          reject(new Error('网络连接失败，请检查网络'));
          return;
        }
        
        // 检查token
        const token = wx.getStorageSync('token');
        if (!token) {
          reject(new Error('登录状态异常，请重新登录'));
          return;
        }
        
        // 检查文件大小
        wx.getFileInfo({
          filePath: filePath,
          success: function(fileInfo) {
            const maxSize = 5 * 1024 * 1024; // 5MB
            if (fileInfo.size > maxSize) {
              reject(new Error('文件大小不能超过5MB'));
              return;
            }
            
            // 开始上传
            wx.uploadFile({
              url: baseURL + 'common/upload',
              filePath: filePath,
              name: fieldName,
              header: {
                'Authorization': 'Bearer ' + token,
                'Content-Type': 'multipart/form-data'
              },
              success(result) {
                console.log('上传结果:', result);
                
                try {
                  const data = JSON.parse(result.data);
                  console.log('解析后的数据:', data);
                  
                  if (result.statusCode === 200) {
                    // 检查服务器返回的消息和文件名
                    if (data.msg === '操作成功' && data.fileName) {
                      // 拼接完整的图片URL
                      const fullImageUrl = data.fileName;
                      console.log('完整图片URL:', fullImageUrl);
                      resolve(fullImageUrl);
                    } else if (data.code === 200 && data.data) {
                      // 兼容旧的响应格式，也拼接完整URL
                      const fullImageUrl = 'http://localhost:8080' + data.data;
                      console.log('完整图片URL(旧格式):', fullImageUrl);
                      resolve(fullImageUrl);
                    } else {
                      reject(new Error(data.msg || '上传失败，返回路径为空'));
                    }
                  } else {
                    reject(new Error(data.msg || '上传失败'));
                  }
                } catch (e) {
                  console.error('解析上传结果失败:', e);
                  console.error('上传返回原始数据:', result.data);
                  console.error('状态码:', result.statusCode);
                  
                  // 根据状态码提供更具体的错误信息
                  if (result.statusCode === 401) {
                    reject(new Error('登录已过期，请重新登录'));
                  } else if (result.statusCode === 403) {
                    reject(new Error('没有上传权限'));
                  } else if (result.statusCode === 500) {
                    reject(new Error('服务器错误，请稍后重试'));
                  } else {
                    reject(new Error('上传失败，请重试'));
                  }
                }
              },
              fail(err) {
                console.error('上传失败:', err);
                
                // 根据错误类型提供具体提示
                if (err.errMsg && err.errMsg.includes('timeout')) {
                  reject(new Error('上传超时，请检查网络'));
                } else if (err.errMsg && err.errMsg.includes('fail')) {
                  reject(new Error('网络连接失败'));
                } else {
                  reject(new Error('上传失败，请重试'));
                }
              }
            });
          },
          fail: function(err) {
            console.error('获取文件信息失败:', err);
            reject(new Error('文件读取失败'));
          }
        });
      },
      fail: function(err) {
        console.error('获取网络状态失败:', err);
        reject(new Error('网络状态检查失败'));
      }
    });
  });
};

/**
 * 选择并上传图片
 * @param {Object} options - 配置选项
 * @returns {Promise} 返回上传结果
 */
const chooseAndUploadImage = (options = {}) => {
  return new Promise((resolve, reject) => {
    const {
      count = 1,
      sizeType = ['compressed'],
      sourceType = ['album', 'camera'],
      fieldName = 'file'
    } = options;
    
    wx.chooseImage({
      count: count,
      sizeType: sizeType,
      sourceType: sourceType,
      success(res) {
        const tempFilePath = res.tempFilePaths[0];
        
        // 显示加载提示
        wx.showLoading({
          title: '上传中...',
        });
        
        // 上传文件
        uploadFile(tempFilePath, fieldName)
          .then(imagePath => {
            wx.hideLoading();
            wx.showToast({
              title: '上传成功',
              icon: 'success'
            });
            resolve(imagePath);
          })
          .catch(error => {
            wx.hideLoading();
            wx.showToast({
              title: error.message,
              icon: 'error'
            });
            reject(error);
          });
      },
      fail(err) {
        console.error('选择图片失败:', err);
        if (err.errMsg && err.errMsg.includes('cancel')) {
          // 用户取消选择，不显示错误提示
          reject(new Error('用户取消选择'));
        } else {
          wx.showToast({
            title: '选择图片失败',
            icon: 'error'
          });
          reject(new Error('选择图片失败'));
        }
      }
    });
  });
};

/**
 * 简化的上传方案（备选）
 * @param {string} filePath - 文件路径
 * @returns {Promise} 返回上传结果
 */
const simpleUpload = (filePath) => {
  return new Promise((resolve, reject) => {
    const token = wx.getStorageSync('token');
    
    wx.uploadFile({
      url: 'http://localhost:8080/common/upload',
      filePath: filePath,
      name: 'file',
      header: {
        'Authorization': 'Bearer ' + token
      },
      success(result) {
        console.log('简化上传结果:', result);
        try {
          const data = JSON.parse(result.data);
          console.log('解析后的数据:', data);
          
          if (result.statusCode === 200) {
            // 检查服务器返回的消息
            if (data.msg === '操作成功' && data.fileName) {
              // 拼接完整的图片URL
              const fullImageUrl = 'http://localhost:8080' + data.fileName;
              console.log('完整图片URL:', fullImageUrl);
              resolve(fullImageUrl);
            } else {
              reject(new Error(data.msg || '上传失败'));
            }
          } else {
            reject(new Error(data.msg || '上传失败'));
          }
        } catch (e) {
          console.error('解析响应失败:', e);
          reject(new Error('解析响应失败'));
        }
      },
      fail(err) {
        console.error('简化上传失败:', err);
        reject(new Error('网络错误'));
      }
    });
  });
};

export default {
  uploadFile,
  chooseAndUploadImage,
  simpleUpload
};
